package com.cskaoyan.javase.oop2._1extends._10final._3variable._2member;

/**
 * final修饰成员变量,表示成员常量
 *      它仍然存储在对象中,属于对象.它的使用,除了变成常量,其他的没有区别.
 * 语法:
 * [访问权限修饰符] final 数据类型 变量名;
 * 直接写上述语法定义成员常量会报错,显然默认值不能作为它的一个取值,那么成员常量在创建对象时的赋值方式还有:
 *      1.显式赋值
 *      2.构造代码块赋值
 *      3.构造器赋值
 * 以上三种赋值方式,必须选择其一,也只能选择其一.赋值只有一次,一旦确定取值,就不可更改了.
 * 注意:如果使用构造器进行赋值,必须让所有构造器都能完成成员常量的赋值,少一个构造器都不行.
 *
 * 思考:
 *      成员常量是不是一个真的常量?
 *      不是,因为每个对象都有属于它的一个成员常量,取值可能完全不同.
 *      如果我需要一个在类整个全局都是唯一的常量,显然是final修饰的static静态变量.
 *
 * @since 09:47
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s1 = new Student(20);
        Student s2 = new Student(30);
    }
}

class Student {
    // Variable 'age' might not have been initialized
    final int age;
    {
        // age = 20;
    }

    public Student(int age) {
        this.age = age;
    }

    public Student() {
        this.age = 18;
    }
}